home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swags_z.zip / TSR.SWG / 0033_NO Divide by zero TSR.pas < prev   
Pascal/Delphi Source File  |  1995-02-28  |  1KB  |  63 lines

  1. (*
  2.  
  3. Date : Dec 27 '94, 13:49
  4. From : Arne de.Bruijn                                        2:281/705.8
  5. To   : Bert Kremer
  6. Subj : Math Error
  7.  
  8. *)
  9.  
  10. { No divide by zero, Arne de Bruijn, 1994, PD }
  11. { Works not for longints, they've a check inside the runtime lib, }
  12. { and not for floating point math }
  13. uses Dos;
  14. procedure NewInt0(Flags, CS, IP, AX, BX,
  15.   CX, DX, SI, DI, DS, ES, BP: Word); interrupt; assembler;
  16. const
  17.  InsLen:array[0..3] of byte=(2,3,4,2);
  18. asm
  19.  les di,dword ptr [IP]  { Get address of instruction }
  20.  xor ax,ax              { Test for 808x }
  21.  push ax
  22.  popf
  23.  pushf
  24.  pop ax
  25.  and ax,0f000h
  26.  cmp ax,0f000h
  27.  je @Fixed              { Jump if it's a 808x, no update needed }
  28.  mov bl,[es:di+1]       { Get address mode byte }
  29.  and bx,0c7h
  30.  cmp bl,6
  31.  jne @NoImm
  32.  add IP,4
  33.  jmp @Fixed
  34. @NoImm:
  35.  mov cl,6
  36.  shr bx,cl
  37.  mov bl,byte ptr [InsLen+bx]
  38.  add IP,bx
  39. @Fixed:
  40.  { Change result to 0 }
  41.  mov &AX,0
  42.  cmp byte ptr [es:di],0f7h  {Change DX only if word operand }
  43.  jne @NoWord
  44.  mov &DX,0
  45. @NoWord:
  46. end;
  47.  
  48.  
  49. var
  50.  W:word;
  51.  L:longint;
  52.  R:real;
  53. begin
  54.  { No need to save Int 0, already done in RTL }
  55.  SetIntVec(0,@NewInt0);
  56.  W:=0;
  57.  WriteLn(1 div W);  { Displays 0 }
  58.  L:=0;
  59.  WriteLn(1 div L);  { Runtime error 200 .... }
  60.  R:=0.0;
  61.  WriteLn(1.0/R);    { Runtime error 200 .... }
  62. end.
  63.